
/*
 * @Author: 于建霞 
 * @Date: 2020-09-24 09:32:30 
 * @Last Modified by: mikey.zhaopengey.zhaopeng
 * @Last Modified time: 2020-10-27 15:03:00
 * 
 * * @description: 根据数组中的证件号分组、同组之间按照票号升序排序、将分组的姓名首字母按照字母表排序、 
 * sortArr排序的数组 ,name姓名 ,idNo证件号,tickNo票号
 */
export const passengersSortFun = (sortArr = [], name, idNo, tickNo) => {
    if (sortArr.length === 0) {
        return sortArr;
    };
    // copy数组用于比较
    let sortArrCopy = JSON.parse(JSON.stringify(sortArr));
    var getArr = [];
    let filterArr = [];
    for (let i = 0; i < sortArr.length; i++) {
        // 如果数组元素为空，则说明已经分组过，直接跳过当次循环
        if (sortArr[i]._repeatItem === 'repeat') continue;
        // 获取同组
        filterArr = sortArrCopy.filter(item => {
            return item[idNo] === sortArr[i][idNo] && item[name] === sortArr[i][name];
        })
        // 如果分组大于一条, 根据票号升序排序， 并且添加标记字段
        if (filterArr.length > 1) {
            for (let item of filterArr) {
                item.colorSign = true;
            }
            filterArr = filterArr.sort(arrSortFun(tickNo, "desc"));
           // 得到一个分组后的二维数组
            getArr.unshift(filterArr);//有重复就添加到前面
        }else{
            getArr.push(filterArr); //没有重复就添加到后面
        }
        
        // 如果数组元素已经分组过，则该项置空
        for (let j = 0; j < sortArr.length; j++) {
            if (filterArr[0][idNo] == sortArr[j][idNo]) {
                sortArr[j]._repeatItem = 'repeat';
            }
        }
        filterArr = [];
    }
    filterArr = null;
    // 将二维数组 根据姓名首字符 按照字母表顺序排序
    getArr = getArr.sort(function (x, y) {
        if (x.length === 1) return;
        return x[0][name].localeCompare(y[0][name]);
    });
    // 二维数组转一维
    getArr = getArr.reduce((a, b) => a.concat(b));
    return getArr;
}

/**
*  数组对象排序函数
*  property排序的字段 desc 降序  asc 升序
*/
export const arrSortFun = (property, desc = 'desc') => {
    return function (a, b) {
        var value1 = Number(a[property]);
        var value2 = Number(b[property]);
        if (desc === 'desc') {
            return value1 - value2;
        } else {
            return value2 - value1;
        }
    }
}